/**
 * \file CMyTable.h
 * \author Corentin Le Bail
 * \date 2009-2012
 * \brief Fichier de déclaration de la class CMyTable
 */
//------------------------------------------------------------------------------
#ifndef __CMYTABLE_H__
#define __CMYTABLE_H__
//------------------------------------------------------------------------------
#include <QSqlQuery>
#include "CMyTableWidgetItem.h"
#include "CColumnModel.h"
#include "CChamp.h"
//------------------------------------------------------------------------------
/**
 * \class CMyTable CMyTable.h "CMyTable.h"
 * \brief Classe de description des tables.
 */
class CMyTable : public QTableWidget, public CChamp
{
	Q_OBJECT
	public:
		/**
		 * \fn CMyTable(QWidget *parent=0)
		 * \brief Constructeur
		 * \param[in] parent Référence vers un objet parent
		 */
		CMyTable(QWidget *parent=0);
		/**
		 * \fn void find(QString findText)
		 * \brief Recherche un texte dans la grille
		 * \param[in] findText Le texte à rechercher
		 */
		void find(QString findText);
		/**
		 * \fn Qt::SortOrder getAscending(void)
		 * \return Le sens de tri actiuel
		 */
		Qt::SortOrder getAscending(void) { return _ascending; }
		/**
		 * \fn void sortByColumn(int column, Qt::SortOrder ascending)
		 * \brief Tri la grille suivant la colone column dans le sens ascending
		 * \param[in] column Colonne de référence pour le tri
		 * \param[in] ascending Sens de tri
		 */
		void sortByColumn(int column, Qt::SortOrder ascending) { colSort=column; QTableWidget::sortByColumn(column, ascending); }
		/**
		 * \fn QString toCSV(QString separator=";", QString stringSeparator="\"", QString lineEnd="\r\n")
		 * \brief Exporte la grille au format CSV
		 * \param[in] separator Séparteur de champ
		 * \param[in] stringSeparator Séparteur pour les chaines de caractères
		 * \param[in] lineEnd Caractère de fin de ligne
		 */
		QString toCSV(QString separator=";", QString stringSeparator="\"", QString lineEnd="\r\n");
		/**
		 * \fn void exportCSV(QString suggestFileName="", QString separator=";", QString stringSeparator="\"", QString lineEnd="\r\n")
		 * \brief Exporte la grille au format CSV et l'enregistre dans un fichier
		 * \param[in] suggestFileName Nom du fichier suggéré
		 * \param[in] separator Séparteur de champ
		 * \param[in] stringSeparator Séparteur pour les chaines de caractères
		 * \param[in] lineEnd Caractère de fin de ligne
		 */
		void exportCSV(QString suggestFileName="", QString separator=";", QString stringSeparator="\"", QString lineEnd="\r\n");
		/**
		 * \fn void setColumnsModel(QList<CColumnModel *> *columnsModel)
		 * \brief Affecte les modèles de colonne à la grille
		 * \param[in] columnsModel Liste des modèles de colonne
		 */
		void setColumnsModel(QList<CColumnModel *> *columnsModel);
		/**
		 * \fn CColumnModel * getColumnModel(int column)
		 * \return Le modèle de colonne de la colonne column
		 * \param[in] column Numéro de la colonne
		 */
		CColumnModel * getColumnModel(int column) { return _columnsModel->at(column); }
		/**
		 * \fn int getColumnModelCount(void)
		 * \return Le nombre de modèle de colonne
		 */
		int getColumnModelCount(void) { return _columnsModel->size(); }
		/**
		 * \fn int loadGrille(QSqlQuery *query, QString primaryKeyName="")
		 * \brief Charge les données dans la grille
		 * \param[in] query Les données SQL à charger
		 * \param[in] primaryKeyName Nom de la clé primaire
		 * \return Le nombre de ligne de la table
		 */
		int loadGrille(QSqlQuery *query, QString primaryKeyName="");
		/**
		 * \fn QString getValue(void)
		 * \return La valeur associé à la table
		 */
		QString getValue(void);
		/**
		 * \fn void setValue(QVariant value)
		 * \brief affecte la valeur associé à la table
		 * \param[in] value Valeur à associé
		 */
		void setValue(QVariant value);
		/**
		 * \fn void setStateEnable(bool enable)
		 * \brief Enable / disable la table si elle est "standaloneEnabled"
		 * \param[in] enable True pour enableder, false sinon
		 */
		void setStateEnable(bool enable);
		/**
		 * \fn void setAttribut(EAttribut value)
		 * \brief Affecte les attributs de la table 
		 * \param[in] value Valeur de l'attribut
		 */
		void setAttribut(EAttribut value);
		/**
		 * \fn void setTextCondition(QString value)
		 * \brief Affecte le texte de la condition si obligatoire coditionnel 
		 * \param[in] value Texte de la condition
		 */
		void setTextCondition(QString value);
		/**
		 * \fn bool isEmpty(void)
		 * \return True si la tbale est vide, false sinon
		 */
		bool isEmpty(void);
	private:
		int colSort;
		Qt::SortOrder _ascending;
		QHeaderView *hh;
		QList<CColumnModel *> *_columnsModel;
		QString value;
		
		int quickFindASC(QString findText, int debut, int fin);
		int quickFindDES(QString findText, int debut, int fin);
	private slots:
		void OnSectionClicked(int logicalIndex);
	protected:
		/**
		 * \fn void keyPressEvent(QKeyEvent * e)
		 * \brief Se produit lors de l'appui sur une touche
		 * \param[in] e L'évenement assossié à l'appui sur la touche
		 */
		void keyPressEvent(QKeyEvent * e);
	signals:
		/**
		 * \fn void ascendingChange(Qt::SortOrder ascending)
		 * \brief Le sens de tri change
		 * \param[in] ascending Le nouveau sens de tri
		 */
		void ascendingChange(Qt::SortOrder ascending); 
		/**
		 * \fn void columnChange(int col)
		 * \brief La colonne de référence change
		 * \param[in] col La nouvelle colonne de référence
		 */
		void columnChange(int col);
		/**
		 * \fn void valid(int row, int col)
		 * \brief Valide la case au coordonnées row, col
		 * \param[in] row Ordonnée de la case
		 * \param[in] col Absice de la case
		 */
		void valid(int row, int col);
		/**
		 * \fn void beforeInsert(const QSqlQuery *query, CMyTableWidgetItem *item)
		 * \brief Se poduit avant insertion d'un item
		 * \param[in] query Résultat de la requête SQL
		 * \param[in] item Item a insérer
		 */
		void beforeInsert(const QSqlQuery *query, CMyTableWidgetItem *item);
		/**
		 * \fn void beforeChangeRecord(const QSqlQuery *query, int row)
		 * \brief Se poduit avant le changement d'une ligne
		 * \param[in] query Résultat de la requête SQL
		 * \param[in] row Index de la ligne
		 */
		void beforeChangeRecord(const QSqlQuery *query, int row);
};
//------------------------------------------------------------------------------
#endif //__CMYTABLE_H__
//------------------------------------------------------------------------------